package student

import "fmt"

type SchoolInformation struct {
	SchoolName string
	Address    string
	SchoolType string
}

// Student 结构体代表了一个学生的基本信息。
// 它封装了学生的属性，包括ID、姓名、年龄、性别和年级。
type Student struct {
	ID    int    // ID 字段用于唯一标识一个学生。
	Name  string // Name 字段记录了学生的姓名。
	Age   int    // Age 字段表示学生的年龄。
	Sex   string // Sex 字段描述了学生的性别。
	Grade int    // Grade 字段反映了学生所在的年级。
	SchoolInformation
}

var students []Student

// SchoolInformationPrinter 打印学校信息。
func (schoolInfor SchoolInformation) SchoolInformationPrinter() {
	fmt.Printf("学校名称：%s\n", schoolInfor.SchoolName)
	fmt.Printf("学校地址：%s\n", schoolInfor.Address)
	fmt.Printf("学校类型：%s\n", schoolInfor.SchoolType)
	fmt.Println("-------------------------")
}

// studentsPrint 打印学生信息。
// 该方法属于 Student 类型，用于以格式化的方式输出学生的详细信息。
// 没有返回值，因为该方法的目的是直接在控制台打印信息。
func (student Student) studentsPrint() {
	// 打印学生信息的开始边界线
	fmt.Println("-------------------------")
	// 打印成年或未成年的提示信息
	if student.IfAdult() {
		fmt.Println("该学生已经成年")
	} else {
		fmt.Println("该学生还未成年")
	}
	// 打印学生的姓名
	fmt.Println("学生姓名：%s", student.Name)
	// 打印学生的年龄
	fmt.Println("学生年龄：%d", student.Age)
	// 打印学生的性别
	fmt.Println("学生性别：%s", student.Sex)
	// 打印学生的年级
	fmt.Println("学生年级：%d", student.Grade)
	// 打印学生的学校信息
	student.SchoolInformationPrinter()
	// 打印学生信息的结束边界线
	fmt.Println("-------------------------")
}

func (student Student) IfAdult() bool {
	return student.Age >= 18
}

func InitializeStudents() {
	var schoolInformation [3]SchoolInformation
	schoolInformation[0] = SchoolInformation{SchoolName: "第一中学", Address: "北京", SchoolType: "普通中学"}
	schoolInformation[1] = SchoolInformation{SchoolName: "第三中学", Address: "上海", SchoolType: "普通中学"}
	schoolInformation[2] = SchoolInformation{SchoolName: "第三中学", Address: "广州", SchoolType: "普通中学"}

	var initialStudents [3]Student
	initialStudents[0] = Student{ID: 1, Name: "张三", Age: 18, Sex: "男", Grade: 3, SchoolInformation: schoolInformation[0]}
	initialStudents[1] = Student{ID: 2, Name: "李四", Age: 17, Sex: "女", Grade: 3, SchoolInformation: schoolInformation[1]}
	initialStudents[2] = Student{ID: 3, Name: "王五", Age: 16, Sex: "男", Grade: 3, SchoolInformation: schoolInformation[2]}

	// 将初始学生信息添加到全局切片中。
	students = append(students, initialStudents[:]...)
}

// GetStudentInformation 函数用于获取并打印学生信息数组。
// 该函数没有输入参数和返回值。
// 此函数首先初始化一个包含3个学生信息的数组，然后遍历数组，
// 并使用 fmt.Printf 函数按格式输出每个学生的信息。
func GetStudentInformation() {
	// 检查是否已经初始化过学生信息
	if len(students) == 0 {
		InitializeStudents()
	}

	// 遍历学生信息数组并打印每个学生的信息。
	for _, student := range students {
		student.studentsPrint()
	}
}

// InsertStudentInformation 函数用于向学生信息数组中添加新的学生信息。
// 该函数没有输入参数和返回值。
// 此函数通过用户输入获取学生信息，并将其添加到学生信息切片中。
func InsertStudentInformation() {
	var id int
	var name string
	var age int
	var sex string
	var grade int
	var schoolName string
	var address string
	var schoolType string

	fmt.Print("请输入学生ID: ")
	fmt.Scan(&id)
	fmt.Print("请输入学生姓名: ")
	fmt.Scan(&name)
	fmt.Print("请输入学生年龄: ")
	fmt.Scan(&age)
	fmt.Print("请输入学生性别: ")
	fmt.Scan(&sex)
	fmt.Print("请输入学生年级: ")
	fmt.Scan(&grade)
	fmt.Print("请输入学校名称: ")
	fmt.Scan(&schoolName)
	fmt.Print("请输入学校地址: ")
	fmt.Scan(&address)
	fmt.Print("请输入学校类型: ")
	fmt.Scan(&schoolType)

	newStudent := Student{
		ID:                id,
		Name:              name,
		Age:               age,
		Sex:               sex,
		Grade:             grade,
		SchoolInformation: SchoolInformation{SchoolName: schoolName, Address: address, SchoolType: schoolType},
	}
	students = append(students, newStudent)

	fmt.Println("学生信息已添加成功。")
}
